/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package model.handler;

import java.sql.SQLException;
import java.util.Date;
import java.util.LinkedList;
import model.dao.RegistroSaidaDAO;
import model.dto.RegistroSaidaDTO;
import model.exception.MissingIdException;
import model.exception.NoChangesOnUpdateException;
import model.exception.NotNullFieldsException;

/**
 *
 * @author Gabriel
 */
public class RegistroSaidaHandler {

    RegistroSaidaDAO registroSaidaDAO;

    public RegistroSaidaHandler() throws SQLException, ClassNotFoundException {
        registroSaidaDAO = new RegistroSaidaDAO();
    }

    private void verificaCamposNotNullInsercao(RegistroSaidaDTO registroSaidaDTO) throws NotNullFieldsException {
        if (registroSaidaDTO.getData() == null) {
            throw new NotNullFieldsException("A Data de Saída é informação obrigatória em um Registro de Saída");
        }

        if (registroSaidaDTO.getDestino() == null) {
            throw new NotNullFieldsException("O Destino é informação obrigatória em um Registro de Saída");
        }

        if (registroSaidaDTO.getQuantidade() == null) {
            throw new NotNullFieldsException("A Quantidade de Mudas é informação obrigatória em um Registro de Saída");
        }
    }

    private void verificaCamposNotNullAtualizacao(RegistroSaidaDTO registroSaidaDTO,
                                                  boolean atualizaData,
                                                  boolean atualizaQuantidade,
                                                  boolean atualizaDestino) throws NotNullFieldsException {

        if ((registroSaidaDTO.getData() == null) && atualizaData) {
            throw new NotNullFieldsException("A Data de Saída é informação obrigatória em um Registro de Saída");
        }

        if ((registroSaidaDTO.getDestino() == null) && atualizaDestino) {
            throw new NotNullFieldsException("O Destino é informação obrigatória em um Registro de Saída");
        }

        if ((registroSaidaDTO.getQuantidade() == null) && atualizaQuantidade) {
            throw new NotNullFieldsException("A Quantidade de Mudas é informação obrigatória em um Registro de Saída");
        }
    }

    public LinkedList<RegistroSaidaDTO> getTodosRegistrosSaida() throws SQLException {
        return registroSaidaDAO.getTodosRegistrosSaida();
    }

    public LinkedList<RegistroSaidaDTO> pesquisaRegistroSaida(Integer id,
                                                              Date dataSaida,
                                                              Integer quantidade,
                                                              String destino,
                                                              String observacao) throws SQLException {
        return registroSaidaDAO.pesquisaRegistroSaida(id, dataSaida, quantidade, destino, observacao);

    }

    public void cadastraRegistroSaida(RegistroSaidaDTO registroSaidaDTO) throws SQLException, NotNullFieldsException {
        verificaCamposNotNullInsercao(registroSaidaDTO);
        registroSaidaDAO.insereRegistroSaida(registroSaidaDTO);
    }

    public void atualizaRegistroSaida(RegistroSaidaDTO registroSaidaDTO,
                                      boolean atualizaData,
                                      boolean atualizaQuantidade,
                                      boolean atualizaDestino,
                                      boolean atualizaObservacao) throws SQLException, NotNullFieldsException, NoChangesOnUpdateException, MissingIdException {

        // Verifica se o identificador foi passado
        if (registroSaidaDTO.getId() == null) {
            throw new MissingIdException();
        }

        verificaCamposNotNullAtualizacao(registroSaidaDTO, atualizaData, atualizaQuantidade, atualizaDestino);

        /* Verifica se existe atualização */
        if (!(atualizaData || atualizaQuantidade || atualizaDestino || atualizaObservacao)) {
            throw new NoChangesOnUpdateException();
        }

        registroSaidaDAO.atualizaRegistroSaida(registroSaidaDTO, atualizaData, atualizaQuantidade, atualizaDestino, atualizaObservacao);
    }

}
